Основные типы
===============

.. index::
  CPU
  true
  false

Мы видели, что основным элементом компьютера является центральный процессор. Большинство задач
программы выполняются центральным процессором, а остальные отправляются в другие части
компьютера. Наименьшая единица данных в компьютере называется бит. Значением бита может быть
либо 0, либо 1. Поскольку тип данных, который может содержать только значения 0 и 1, будет иметь очень
ограниченное применение, центральный процессор поддерживает более крупные типы данных, представляющие собой комбинации более
чем одного бита. В качестве примера, байт обычно состоит из 8 бит. Если N-разрядный тип данных
является наиболее эффективным типом данных, поддерживаемым процессором, мы считаем, что это N-разрядный
CPU: как в 32-разрядном CPU, 64-разрядном CPU и т.д. Типов данных, поддерживаемых процессором, по-прежнему недостаточно: они не могут
представлять понятия более высокого уровня, такие как имя студента или игральная карта. Также,
Фундаментальных типов данных D недостаточно для представления многих
концепций более высокого уровня. Такие концепции должны быть определены программистом как структуры и классы
с использованием преимуществ фундаментальных типов. Мы рассмотрим структуры и классы в последующих
главах.Основные типы языка D аналогичны основным типам многих других
языков.

Логический тип
--------------------------

.. index::
  true
  false
  логическое выражение


Это тип, который используется в логических выражениях. Он принимает значение true - истина, false - ложь
По умолчание переменные логического типа инициализируется значением false

Целочисленные типы
--------------------

Целые числа - это числа, у которых нет дробных частей. Например, 3 - это целое число, а 3.5 - нет.
Типы, которые могут иметь отрицательные и положительные значения, являются типами со знаком.
Типы, которые могут иметь только положительные значения, являются типами без знака. Буква u в начале названия этих типов происходит от
unsigned.

**Целочисленные типы**

.. index::
  целочисленные типы
  byte
  ubyte
  short
  ushort
  int
  uint
  long
  ulong

.. list-table:: Title
   :widths: 25 25 50
   :header-rows: 1
   :align: center

   * - тип
     - диапазон
     - начальное значение
   * - byte
     - знаковый 8 bits
     - 0
   * - ubyte
     - без знака 8 бит
     - 0
   * - short
     - знаковый  16 бит
     - 0
   * - ushort
     - без знака 16 бит
     - 0
   * - int
     - знаковый  32 бит
     - 0
   * - uint
     - знаковый  32 бит
     - 0
   * - long
     - без знака 64 бит
     - 0
   * - ulong
     - знаквый  64 бит
     - 0


Типы с плавающей запятой
------------------------

.. index::
  типы с плавающей точкой 
  float
  double
  real
  nan


Типы с плавающей точкой - это типы, которые могут представлять значения с дробями, как в
1.25. Точность вычислений с плавающей запятой напрямую связана с разрядностью CPU
чем больше количество бит, тем точнее результаты. Только
типы с плавающей точкой могут представлять дроби; целочисленные типы, такие как int, могут представлять только
целые значения, такие как 1 и 2. В отличие от целых чисел, для типов с плавающей точкой существуют специальные значения, которые представляют
недопустимые значения. Эти специальные значения записываются как свойства, например .nan и являются
сокращением от "не число".

.. list-table:: Title
   :widths: 25 25 50
   :header-rows: 1
   :align: center

   * - тип
     - диапазон
     - начальное значение
   * - float
     - знаковый 32 bits
     - float.nan
   * - double
     - знаковый 64 бит
     - double.nan
   * - real
     - минимум 64 бита, может быть больше, если позволяет аппарутура
     - real.nan


Символьные типы
---------------

.. index::
  символьные типы
  char
  wchar
  dchar

Эти типы используются для представления букв алфавитов и других символов систем
письма:

.. list-table:: Title
   :widths: 25 25 50
   :header-rows: 1
   :align: center

   * - тип
     - диапазон
     - начальное значение
   * - char
     - кодовая единица UTF-8
     - 0xFF
   * - wchar
     - кодовая единица UTF-16
     - 0xFFFF
   * - dchar
     - кодовая единица UTF-32
     - 0x0000FFFF

В дополнение к вышесказанному, ключевое слово void обозначает отсутствие типа.
Ключевые слова cent и ucent зарезервированы для будущего использования для представления
128-битных значений со знаком и без знака.

Свойства типов
---------------

.. index::
  свойства типов
  stringof
  sizeof
  min
  max
  init

Типы D имеют свойства, которые предоставляют информацию об этих типах.
Доступ к свойствам осуществляется с помощью точки после имени типа. Например, к свойству sizeof
в int осуществляется доступ как int.sizeof. В этой главе мы рассмотрим только некоторые свойства типов

#. .stringof - это имя типа
#. .sizeof - длина типа в байтах. (Чтобы определить количество бит, это значение необходимо умножить на 8, количество бит в байте.)
#. .min - сокращение от "минимум"; это наименьшее значение, которое может иметь тип
#. .max - сокращение от "максимальный"; это наибольшее значение, которое может иметь тип
#. .init - сокращение от "начальное значение" (значение по умолчанию); это значение, которое D присваивает типу, когда начальное значение не указано

Вот программа, которая выводит эти свойства для int:

.. code-block:: d

    import std.stdio;
    void main()
    {
        writeln("Тип : ", int.stringof);
        writeln("Длина в байтах:", int.sizeof);
        writeln("Минимальное значение : ", int.min);
        writeln("Максимальное значение : ", int.max);
        writeln("Начальное значение : ", int.init);
    }


.. code-block:: console

    Выходные данные программы следующие
    Тип : int
    Длина в байтах: 4
    Минимальное значение : -2147483648
    Максимальное значение : 2147483647
    Начальное значение : 0


size_t
-------

.. index:: 
  size_t

Вы также столкнетесь с типом size_t. size_t - это не отдельный тип, а
псевдоним существующего беззнакового типа. Его название происходит от понятие размер типа. Это наиболее
подходящий тип для представления таких понятий, как размер или количество.
size_t достаточно велик, чтобы представлять количество байт памяти, которое
потенциально может использовать программа. Его фактический размер зависит от системы: uint в
32-разрядной системе и ulong в 64-разрядной системе. По этой причине ulong больше, чем
size_t в 32-разрядной системе. Вы можете использовать свойство .stringof, чтобы узнать, какой size_t является псевдонимом в вашей
системе:

.. code-block:: d

    import std.stdio;
    void main()
    {
        writeln(size_t.stringof);
    }

.. code-block:: console

    ulong

Упражнение
-------------

Выведите свойства других типов.
#. Вы не можете использовать зарезервированные типы cent и ucent ни в одной программе.
#. void не имеет свойств .min, .max и .init.
#. Значения символьных типов .min, .max и .init не имеют видимых представлений, которые вы можете увидеть на выходе.
#. Свойство .min нельзя использовать для типов с плавающей запятой. (Вы можете видеть все различные свойства для основных типов в спецификации общего свойства1)

Как мы увидим позже в главе о типах с плавающей точкой (стр. 42), вы должны использовать
отрицательное значение свойства .max, например, вместо -double.max.
Решение приведено на странице 695.
